package main

import (
	"errors"
	"fmt"
)

// main
//
//	@Description: 使用数组模拟栈
func main() {
	st := &Stack{
		Capacity: 5,
		TopIndex: -1,
		Arr:      [5]interface{}{},
	}
	st.Push(1)
	st.Push(2)
	st.Push(3)
	st.Push(4)
	st.Push(5)
	//st.Push(6)
	st.PrintStack()
	fmt.Println(st.Pop())
	fmt.Println(st.Pop())
	fmt.Println(st.Pop())
	fmt.Println(st.Pop())

}

type Stack struct {
	Capacity int // 最大容量
	TopIndex int // 栈顶的index
	Arr      [5]interface{}
}

// Push
//
//	@Description:  Push
//	@receiver s
//	@param ele
func (s *Stack) Push(ele interface{}) {
	if s.TopIndex >= s.Capacity-1 {
		panic(errors.New("栈满"))
	}
	s.TopIndex++
	s.Arr[s.TopIndex] = ele
}

// Pop
//
//	@Description:  Pop
//	@receiver s
//	@return ele
func (s *Stack) Pop() (ele interface{}) {
	if s.TopIndex == -1 {
		panic(errors.New("栈空"))
	}
	ele = s.Arr[s.TopIndex] // 取值
	s.TopIndex--            // 栈顶index-1
	return ele
}

func (s *Stack) PrintStack() {
	if s.TopIndex == -1 {
		fmt.Println("stack empty")
		return
	}
	for i := s.TopIndex; i >= 0; i-- {
		fmt.Printf("stack[%d]=%d\n", i, s.Arr[i])
	}

}
